

from rest_framework import serializers
from goods.models import SKUImage,SKU


# 新建图片可选sku
class SKUSimpleModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = SKU
        fields = [
            'id',
            'name'
        ]

# 图片序列化器
class ImageModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = SKUImage
        fields = [
            'id',
            'sku', # 类型为PrimaryKeyRelatedField，在反序列化的时候接收前端传来的关联对象主键值，校验之后为关联对象
            # TODO：image前端传递文件数据，被校验成了文件对象
            'image' # 序列化器中ImageField字段其序列化的结果为该字段url属性值： image.url-->完整的图片链接
        ]

    # TODO: 此处我们通过重写SKUImage图片序列化器的validate函数，在校验的过程中介入实现图片上传
    def validate(self, attrs):
        # TODO：从image图片对象中提取图片数据，上传fdfs，然后有效数据中存储文件索引id保存mysql
        from fdfs_client.client import Fdfs_client
        from django.conf import settings
        import os

        file = attrs.get('image') # 文件对象
        content = file.read() # 文件字节数据

        config_path = os.path.join(settings.BASE_DIR, 'utils/client.conf')
        conn = Fdfs_client(config_path)

        ret = conn.upload_by_buffer(content)
        if not (ret and ret['Status'] == 'Upload successed.'):
            # 上传失败
            raise serializers.ValidationError('fdfs上传图片失败')

        file_id = ret['Remote file_id']

        # 上传之后把有效数据里面的image字段更改为文件索引id值存入mysql
        attrs['image'] = file_id

        return attrs











